package com.thd.springboottest.aop;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
//@Aspect： 告诉Spring当前类是一个切面类
@Aspect
//这个切面类必须被注册到ioc容器中!!!
@Component
public class LogAspect {
	
	//抽取公共的切入点表达式
		//1、本类引用
		//2、其他的切面引用
		@Pointcut("execution(public * com.thd.springboottest.service.*.*(..))")
		public void pointCut(){};
		
		//@Before在目标方法之前切入；切入点表达式（指定在哪个方法切入）
		@Before("pointCut()")
		public void logStart(JoinPoint joinPoint){
			Object[] args = joinPoint.getArgs();
			System.out.println(""+joinPoint.getSignature().getName()+"运行。。。@Before:参数列表是：{"+Arrays.asList(args)+"}");
		}
		
		@After("com.thd.springboottest.aop.LogAspect.pointCut()")
		public void logEnd(JoinPoint joinPoint){
			System.out.println(""+joinPoint.getSignature().getName()+"结束。。。@After");
		}
		
		//JoinPoint一定要出现在参数表的第一位
		@AfterReturning(value="pointCut()",returning="result")
		public void logReturn(JoinPoint joinPoint,Object result){
			System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:运行结果：{"+result+"}");
		}
		
		@AfterThrowing(value="pointCut()",throwing="exception")
		public void logException(JoinPoint joinPoint,Exception exception){
			System.out.println(""+joinPoint.getSignature().getName()+"异常。。。异常信息：{"+exception+"}");
		}
	
	
}
